﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;

/* using 语句可以确保实现了 IDisposable 接口的对象在离开作用域时自动调用 Dispose() 方法释放资源，等价于在 finally 中手动释放资源，但代码更简洁。*/
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SQL_Datebase_inset_delete_reader_update
{
    class Program
    {
        ///
        static void Main(string[] args)
        {

            //以下方法被注释，是为了演示不同的功能，一次只执行一个
            //ConnectDB();

            //ExecuteInsert();

            //ExecuteUpdate();

            //ExecuteDelete();

            //ExecuteSingleResult();

            //ExecuteReader();

            // ExecuteInsertByHelper();

            // ExecuteSingleResultByHelper();

            //ExecuteReaderByHelper();
            //AddCourse();
            AddCourse1();

            //Console.Read();
        }

        #region 基础CRUD方法编写

        static void ConnectDB()
        {
            //创建数据库连接对象
            string connString = "Server=.;DataBase=CourseManageDB;Uid=sa;Pwd=123456";
            SqlConnection conn = new SqlConnection(connString);

            //打开连接
            conn.Open();
            if (conn.State == ConnectionState.Open) Console.WriteLine("连接成功！");

            //关闭连接
            conn.Close();

            if (conn.State == ConnectionState.Closed) Console.WriteLine("关闭成功！");
        }

        static void ExecuteInsert()
        {
            //【1】创建连接对象
            string connString = "Server=.;DataBase=CourseManageDB;Uid=sa;Pwd=123456";
            SqlConnection conn = new SqlConnection(connString);

            //定义sql语句
            string sql = " insert into Course(CourseName, CourseContent, ClassHour, Credit, CategoryId, TeacherId)";
            sql += "values ('游泳课', '蛙泳，自由泳', 500, 12, 10, 1000)";

            //【2】创建Command对象
            //SqlCommand cmd = new SqlCommand();
            //cmd.CommandText = sql;
            //cmd.Connection = conn;
            SqlCommand cmd = new SqlCommand(sql, conn);

            //【3】打开数据库连接
            conn.Open();

            //【4】执行操作(下面这个方法，只能用于执行insert、update、delete操作，不能执行select)
            int result = cmd.ExecuteNonQuery();
            /* ExecuteNonQuery() 方法用于执行不返回结果集的 SQL 语句（如 INSERT、UPDATE、DELETE），返回值是受影响的行数。*/

            Console.WriteLine("受影响的行数=" + result);

            //【5】关闭连接
            conn.Close();
        }

        static void ExecuteUpdate()
        {
            //【1】创建连接对象
            string connString = "Server=.;DataBase=CourseManageDB;Uid=sa;Pwd=123456";
            SqlConnection conn = new SqlConnection(connString);

            //定义sql语句
            string sql = "update Course set CourseName='足球', CourseContent='中国足球',";
            sql += "ClassHour=20, CategoryId=10, TeacherId=1001";
            sql += " where CourseId=1042";

            //【2】创建Command对象         
            SqlCommand cmd = new SqlCommand(sql, conn);

            //【3】打开数据库连接
            conn.Open();

            //【4】执行操作(下面这个方法，只能用于执行insert、update、delete操作，不能执行select)
            int result = cmd.ExecuteNonQuery();

            Console.WriteLine("受影响的行数=" + result);

            //【5】关闭连接
            conn.Close();
        }

        static void ExecuteDelete()
        {
            //【1】创建连接对象
            string connString = "Server=.;DataBase=CourseManageDB;Uid=sa;Pwd=123456";
            SqlConnection conn = new SqlConnection(connString);

            //定义sql语句
            string sql = "delete from Course where CourseId=1042";

            //【2】创建Command对象         
            SqlCommand cmd = new SqlCommand(sql, conn);

            //【3】打开数据库连接
            conn.Open();

            //【4】执行操作(下面这个方法，只能用于执行insert、update、delete操作，不能执行select)
            int result = cmd.ExecuteNonQuery();

            Console.WriteLine("受影响的行数=" + result);

            //【5】关闭连接
            conn.Close();
        }

        //执行单一结果的查询

        static void ExecuteSingleResult()
        {
            //【1】创建连接对象
            string connString = "Server=.;DataBase=CourseManageDB;Uid=sa;Pwd=123456";
            SqlConnection conn = new SqlConnection(connString);

            //定义sql语句（不同）
            string sql = "select Count(*) as 课程总数 from Course";

            //【2】创建Command对象         
            SqlCommand cmd = new SqlCommand(sql, conn);

            //【3】打开数据库连接
            conn.Open();

            //【4】执行查询(下面这个方法，一般执行的都是查询，但是有时候也可以同时执行insert、update、delete操作，我们在VIP深入系统学习的时候会讲到)
            object result = cmd.ExecuteScalar();

            Console.WriteLine("查询结果=" + result);

            //【5】关闭连接
            conn.Close();
        }

        static void ExecuteReader()
        {
            //【1】创建连接对象
            string connString = "Server=.;DataBase=CourseManageDB;Uid=sa;Pwd=123456";
            SqlConnection conn = new SqlConnection(connString);

            //定义sql语句
            string sql = "select CourseName, CourseContent, ClassHour from Course where CourseId<1020";

            //【2】创建Command对象         
            SqlCommand cmd = new SqlCommand(sql, conn);

            //【3】打开数据库连接
            conn.Open();

            //【4】执行查询
            SqlDataReader reader = cmd.ExecuteReader();

            //判断是否有查询结果，来决定读取数据
            while (reader.Read())
            {
                Console.WriteLine($"{reader["CourseName"]}\t{reader[1]}\t{reader["ClassHour"]}");
            }
            reader.Close();//关闭读取器对象（千万不要忘记）

            //【5】关闭连接
            conn.Close();
        }



        #endregion

        #region 通过通用SQLHelper类简化CRUD操作

        static void ExecuteInsertByHelper()
        {
            //定义sql语句
            string sql = " insert into Course(CourseName, CourseContent, ClassHour, Credit, CategoryId, TeacherId)";
            sql += "values ('.Net/C#工控上位机开发VIP课程', 'C#基础/OOP/SQL/WinForm/ASP.NET/WPF/PLC控制系统', 200, 12, 10, 1000)";

            int result = SQLHelper.Update(sql);
            Console.WriteLine(result);
        }

        static void ExecuteSingleResultByHelper()
        {
            string sql = "select Count(*) as 课程总数 from Course";
            object result = SQLHelper.GetSingleResult(sql);
            Console.WriteLine(result);
        }

        static void ExecuteReaderByHelper()
        {
            string sql = "select CourseName, CourseContent, ClassHour from Course where CourseId<1020";

            SqlDataReader reader = SQLHelper.GetReader(sql);

            //判断是否有查询结果，来决定读取数据
            while (reader.Read())
            {
                Console.WriteLine($"{reader["CourseName"]}\t{reader[1]}\t{reader["ClassHour"]}");
            }
            reader.Close();//关闭读取器对象（千万不要忘记）在这个地方执行关闭时，会首先自动把它使用的链接对象关闭！不能在这finally连接，因为conn这个地方没有声明
        }

        #endregion
        #region 使用一般数据访问类分离数据操作

        public static void AddCourse()
        {
            //可以通过窗体或者Web界面获取数据                                                                                 
            //【1】获取用户输入信息：用户输入的每一项数据，保存到一个局部变量中
            Console.WriteLine("请输入课程名称：");//模拟从界面输入
            string courseName = Console.ReadLine();
            string courseContent = ".Net框架/C#OOP";
            int classHour = 500;
            int credit = 20;
            int categoryId = 10;
            int teacherId = 1000;
            //【2】调用后台数据访问方法
            int result = new CourseService().AddCourse(courseName, courseContent, classHour, credit, categoryId, teacherId);//这里参数太多不方便，所以我们用实例类来解决
            //【3】显示操作结果
            Console.WriteLine("受影响的行数=" + result);
        }

        public static void AddCourse1()
        {
            //可以通过窗体或者Web界面获取数据                                                                                 
            //【1】获取用户输入信息：用户输入的每一项数据，保存到一个局部变量中
            Console.WriteLine("请输入课程名称：");//模拟从界面输入

             //封装对象:将数据封装到实体的属性中
            Course course = new Course()
            {
                CourseName = Console.ReadLine(),
                CourseContent = Console.ReadLine(),
                ClassHour = Convert.ToInt32(Console.ReadLine()),
                Credit = Convert.ToInt32(Console.ReadLine()),
                CategoryId = Convert.ToInt32(Console.ReadLine()),
                TeacherId = Convert.ToInt32(Console.ReadLine()),
            };
            //【2】调用后台数据访问方法
            int result = new CourseService().AddCourse(course);//这里参数太多不方便，所以我们用实例类来解决
            //【3】显示操作结果
            Console.WriteLine("受影响的行数=" + result);
        }

        public static void DeletCoure()
        {
            Course course = new Course { CourseId = 1023 };
            int result=new CourseService().DeleteCourse(course);
            Console.WriteLine("受影响的行数="+result);
        }

        public static void UpdateCourse()
        {
            Course course= new Course()
            {
                CourseName = Console.ReadLine(),
                CourseContent = Console.ReadLine(),
                ClassHour = Convert.ToInt32(Console.ReadLine()),
                Credit = Convert.ToInt32(Console.ReadLine()),
                CategoryId = Convert.ToInt32(Console.ReadLine()),
                TeacherId = Convert.ToInt32(Console.ReadLine()),
            };
            int result = new CourseService().UpdateCourse(course);
            Console.WriteLine("受影响行数="+result );

        }

        #endregion
    }
}
